package test_slice

import "fmt"

func DoSlice() {
	fmt.Println("切片")
	//通过内置函数 make() 初始化切片s
	var numbers = make([]int, 3, 5)

	printSlice(numbers)
	// var iden = []int{1, 2, 3}

	// slice1 := make()

	// 空切片
	var numbers1 []int
	printSlice(numbers1)

	if numbers == nil {
		fmt.Println("空切片")
	}

	//截取切片
	cutSlice()

	//增加或复制
	appendAndCopy()
}

func cutSlice() {
	numbers := []int{0, 1, 2, 3, 4, 5, 6, 7}

	printSlice(numbers)

	fmt.Println(numbers[1:4])
	fmt.Println(numbers[:4])
	fmt.Println(numbers[5:])
	fmt.Println(numbers[:len(numbers)-1])
}

func appendAndCopy() {
	var numbers []int
	printSlice(numbers)

	numbers = append(numbers, 0)
	printSlice(numbers)

	numbers = append(numbers, 2, 3, 4)
	printSlice(numbers)

	numbers1 := make([]int, len(numbers), cap(numbers)*2)
	printSlice(numbers1)

	copy(numbers1, numbers)
	printSlice(numbers1)
}

func printSlice(x []int) {
	/*
		len() 和 cap() 函数
		切片是可索引的，并且可以由 len() 方法获取长度。
		切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。
	*/
	fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
